package net.form.processing;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.form.filters.Record;
import net.model.RubroCalidad;

public class ClassifiedResult {

	private Map<RubroCalidad, Record> dataset = new HashMap<RubroCalidad, Record>();

	private long totalPixeles = 0;

	private Clasificador clasificador;

	private Double pesoHectolitrico = 0.0;

	private Double humedad = 0.0;

	private ClassifiedContainer classifiedContainer;
	
	private List<Object[]> objectsClassified= new ArrayList<Object[]>();
	
	private Rebaja rebaja;
	
	private Norma norma;

	public ClassifiedResult(Clasificador clasificador) {
		this.clasificador = clasificador;
	}

	public Double getPesoHectolitrico() {
		return pesoHectolitrico;
	}

	public void setPesoHectolitrico(Double pesoHectolitrico) {
		this.pesoHectolitrico = pesoHectolitrico;
	}

	public Double getHumedad() {
		return humedad;
	}

	public void setHumedad(Double humedad) {
		this.humedad = humedad;
	}

	public Clasificador getClasificador() {
		return clasificador;
	}

	public void setClasificador(Clasificador clasificador) {
		this.clasificador = clasificador;
	}

	public ClassifiedContainer getClassifiedContainer() {
		return classifiedContainer;
	}

	public void setClassifiedContainer(ClassifiedContainer classifiedContainer) {
		this.classifiedContainer = classifiedContainer;
		initDataSetModels();
	}

	public List<Object[]> getObjectsClassified() {
		return objectsClassified;
	}

	public void setObjectsClassified(List<Object[]> objectsClassified) {
		this.objectsClassified = objectsClassified;
	}
	
	public Rebaja getRebaja() {
		return rebaja;
	}

	public void setRebaja(Rebaja rebaja) {
		this.rebaja = rebaja;
	}

	public Norma getNorma() {
		return norma;
	}

	public void setNorma(Norma norma) {
		this.norma = norma;
	}

	private void initDataSetModels() {
		totalPixeles = 0;
		dataset.clear();
	}

	public void updateRecord(RubroCalidad rubro, Double cantidadPixeles,
			Double cantidadObjetos) {
		Record partialRecord = null;
		if (dataset.containsKey(rubro)) {
			partialRecord = dataset.get(rubro);
			Double area = partialRecord.getArea() + cantidadPixeles;
			partialRecord.setArea(area);
			Double cantidad = partialRecord.getQuantity() + cantidadObjetos;
			partialRecord.setQuantity(cantidad);
		} else {
			partialRecord = new Record();
			partialRecord.setName(rubro.getDescripcion());
			partialRecord.setArea(cantidadPixeles);
			partialRecord.setQuantity(cantidadObjetos);
		}
		dataset.put(rubro, partialRecord);
		totalPixeles += cantidadPixeles;
	}

	public void execute() {
		Standar stan = new Standar(getClasificador(), getClasificador()
				.getGradoManager());
		DecimalFormat formater = new DecimalFormat("0.00");
		DecimalFormat formaterInteger = new DecimalFormat("0");
		
		for (RubroCalidad agrupador : dataset.keySet()) {
			Record record = dataset.get(agrupador);
			Double porcentaje = 0.0;
			if (totalPixeles != 0)
				porcentaje = (record.getArea() * 100f) / totalPixeles;
			record.setPercentage(porcentaje);
			Object[] o = new Object[] { agrupador.getDescripcion(),
					formaterInteger.format(record.getQuantity()),
					formater.format(porcentaje) + "%" };
//			System.out.println(o[0].toString() + o[1] + o[2]);
			objectsClassified.add(o);
		}

		int clasificadosIncorrectamente = getClasificador()
				.getClasificadosIncorrectamente().size();
		int cantidadObjetos = getClasificador().countObject() ; // - 1 Cantidad
																	// de
																	// objetos
																	// menos el
																	// objeto
																	// referencia
		long clasificadosCorrectamente = cantidadObjetos
				- clasificadosIncorrectamente;
		Double porcentajeCorrectamente = 0.0;
		Double porcentajeIncorrectamente = 0.0;
		if (cantidadObjetos != 0) {
			porcentajeCorrectamente = (clasificadosCorrectamente * 100)
					/ (double) cantidadObjetos;
			porcentajeIncorrectamente = (clasificadosIncorrectamente * 100)
					/ (double) cantidadObjetos;
		}
		Object[] o2 = new Object[] { "Clasificados Correctamente",
				clasificadosCorrectamente,
				formater.format(porcentajeCorrectamente) + "%" };
		Object[] o3 = new Object[] { "Clasificados Incorrectamente",
				clasificadosIncorrectamente,
				formater.format(porcentajeIncorrectamente) + "%" };
//		System.out.println(o2[0].toString() + o2[1] + o2[2]);
//		System.out.println(o3[0].toString() + o3[1] + o3[2]);
		objectsClassified.add(o2);
		objectsClassified.add(o3);

		RubroCalidad humedad = getClasificador().getRubroCalidad(
				Clasificador.RUBRO_CALIDAD_HUMEDAD);
		RubroCalidad pesoHectolitrico = getClasificador().getRubroCalidad(
				Clasificador.RUBRO_CALIDAD_PESO_HECTOLITRICO);
		dataset.put(pesoHectolitrico,
				new Record(pesoHectolitrico.getDescripcion(), 0.0, 0.0,
						this.pesoHectolitrico));
		dataset.put(humedad, new Record(humedad.getDescripcion(),
				0.0, 0.0, this.humedad));

		rebaja = stan.getNorma(dataset);
		norma = rebaja.getNorma();
//		System.out.println(norma.getName());
//		System.out.println(rebaja.getDescuento()+"%");
	}

	public void actualizarDataSetCount(){
		Standar stan = new Standar(getClasificador(), getClasificador()
				.getGradoManager());
//		DefaultTableModel model = (DefaultTableModel) tableRasgos2.getModel();
		DecimalFormat formater = new DecimalFormat("0.00");
		DecimalFormat formaterInteger = new DecimalFormat("0");

		for(RubroCalidad agrupador : dataset.keySet()) {
			Record record = dataset.get(agrupador);
			Double porcentaje = 0.0;
			if (totalPixeles != 0)
				porcentaje = (record.getArea() * 100f) / totalPixeles;
			record.setPercentage(porcentaje);
			Object[] o = new Object[] { agrupador.getDescripcion(),
					formaterInteger.format(record.getQuantity()),
					formater.format(porcentaje) + "%" };
//			System.out.println(o[0].toString() + o[1] + o[2]);
			objectsClassified.add(o);
		}
		
		int clasificadosIncorrectamente = getClasificador().getClasificadosIncorrectamente().size();
		int cantidadObjetos = getClasificador().countObject() - 1; // Cantidad de objetos menos el objeto referencia
		long clasificadosCorrectamente = cantidadObjetos - clasificadosIncorrectamente;
		Double porcentajeCorrectamente = 0.0;
		Double porcentajeIncorrectamente = 0.0;
		if (cantidadObjetos != 0){
			porcentajeCorrectamente = (clasificadosCorrectamente * 100)/ (double) cantidadObjetos;
			porcentajeIncorrectamente = (clasificadosIncorrectamente * 100)/ (double) cantidadObjetos;
		}
		
		Object[] o2 = new Object[] { "Clasificados Correctamente",
				clasificadosCorrectamente,
				formater.format(porcentajeCorrectamente) + "%" };
		Object[] o3 = new Object[] { "Clasificados Incorrectamente",
				clasificadosIncorrectamente,
				formater.format(porcentajeIncorrectamente) + "%" };
//		System.out.println(o2[0].toString() + o2[1] + o2[2]);
//		System.out.println(o3[0].toString() + o3[1] + o3[2]);
		objectsClassified.add(o2);
		objectsClassified.add(o3);

		RubroCalidad humedad = getClasificador().getRubroCalidad(
				Clasificador.RUBRO_CALIDAD_HUMEDAD);
		RubroCalidad pesoHectolitrico = getClasificador().getRubroCalidad(
				Clasificador.RUBRO_CALIDAD_PESO_HECTOLITRICO);
		dataset.put(pesoHectolitrico,
				new Record(pesoHectolitrico.getDescripcion(), 0.0, 0.0,
						this.pesoHectolitrico));
		dataset.put(humedad, new Record(humedad.getDescripcion(),
				0.0, 0.0, this.humedad));

		rebaja = stan.getNorma(dataset);
		norma = rebaja.getNorma();
//		System.out.println(norma.getName());
//		System.out.println(rebaja.getDescuento()+"%");
		
	}

//	public void actualizarDataSetPixel() {
//		for (RubroCalidad agrupador : datasetPixelModel.keySet()) {
//			Record agrupadorClase = datasetPixelModel.get(agrupador);
//			if (agrupadorClase.isGraficar())
//				// Grafico
//				System.out
//						.println("VER bien como guardar esto "
//								+ agrupador.getDescripcion()
//								+ agrupadorClase.getArea());
//			// datasetPixel.setValue(
//			// agrupador.getDescripcion(),agrupadorClase.getArea());
//		}
//	}

}
